package com.spgf.model.dao;

import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;

import com.archtecture.model.enuns.Mensagem;
import com.archtecture.model.exceptions.NegocioException;
import com.spgf.model.dao.util.PadraoDAOAb;
import com.spgf.model.entities.Categoria;
import com.spgf.model.enums.TipoCategoria;

public class CategoriaDAO extends PadraoDAOAb<Categoria> {

	public final static String	NOME_TABELA		= "TBCATEGORIA";
	public final static String	COLUNA_CODIGO	= "CD_CATEGORIA";
	public final static String	COLUNA_NOME		= "NM_CATEGORIA";
	public final static String	COLUNA_TIPO		= "TP_CATEGORIA";

	public CategoriaDAO(final Context context) {
		super(context);
	}

	@Override
	protected String definirColunasUnicas(final Categoria model) throws NegocioException {

		StringBuilder lSb = new StringBuilder();

		if (model.getCodigo() != null) {
			lSb.append(COLUNA_CODIGO + " = " + model.getCodigo());
		}

		if (model.getNome() != null) {

			if (lSb.length() > 0) {
				lSb.append(" AND ");
			}

			lSb.append(COLUNA_NOME + " = '" + model.getNome() + "'");
		}

		if (lSb.length() == 0) {
			throw new NegocioException(Mensagem.UNIQUE_KEY_NAO_DEFINIDA);
		}

		return lSb.toString();
	}

	@Override
	protected Categoria configurarModel(final Cursor cursor) {
		final Categoria newModel = new Categoria();
		newModel.setCodigo(cursor.getInt(cursor.getColumnIndex(COLUNA_CODIGO)));
		newModel.setNome(cursor.getString(cursor.getColumnIndex(COLUNA_NOME)));
		newModel.setTipo(TipoCategoria.getEnum(cursor.getInt(cursor.getColumnIndex(COLUNA_TIPO))));
		return newModel;
	}

	@Override
	protected String configurarOrderBy(String pOrderBy) {

		if (pOrderBy != null) {
			return " " + pOrderBy + " ASC ";
		}

		return " " + COLUNA_NOME + " ASC ";
	}

	@Override
	protected ContentValues configureContetValues(final Categoria model) {
		final ContentValues values = new ContentValues();
		values.put(COLUNA_NOME, model.getNome());
		values.put(COLUNA_TIPO, model.getTipo().getCodigo());
		return values;
	}

	@Override
	protected String definirClausuraWhere(final Categoria model) {
		return null;
	}

	public StringBuilder gerarQueryStringNative() throws NegocioException {

		final StringBuilder lSql = new StringBuilder();

		final List<Categoria> models = executeFindAll(new Categoria(), CategoriaDAO.COLUNA_CODIGO, null);
		for (final Categoria model : models) {

			lSql.append(" INSERT INTO ");
			lSql.append(NOME_TABELA);
			lSql.append(" VALUES ");
			lSql.append("( ");
			lSql.append(model.getCodigo());
			lSql.append(", '");
			lSql.append(model.getNome());
			lSql.append("', ");
			lSql.append(model.getTipo().getCodigo());
			lSql.append(" ); ");
			// lSql.append("\n");

		}

		return lSql;

	}

	@Override
	public String[] getColuns() {
		return new String[] {COLUNA_CODIGO, COLUNA_NOME, COLUNA_TIPO};
	}

	@Override
	protected String getNomeTabela() {
		return NOME_TABELA;
	}

	@Override
	protected String getColunaCodigo() {
		return COLUNA_CODIGO;
	}

}
